package com.example.nacosprovider.Listener;

import org.springframework.stereotype.Component;

import javax.servlet.http.*;
import java.util.HashMap;
import java.util.Map;

@Component
public class MyHttpSessionListener implements HttpSessionListener, HttpSessionAttributeListener {
    public Integer count = 0;

    Map<String, HttpSession> loginList =new HashMap<>();
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("监听器：Session创建");
        count++;
        //se.getSession().setAttribute("count",count);
    }

    /**
     * 当用户session被销毁后触发下面方法
     * 从session域中删除存储的当前用户信息并且触发attributeRemoved方法
     * @param se
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("用户退出");
        count--;
        //se.getSession().getServletContext().setAttribute("count",count);
        se.getSession().removeAttribute("loginUser");
    }

    /**
     * 用户在登录页登录成功时会在session域中添加一个元素并且出发下面方法
     * 当用户登录成功时 把用户名及其session信息存入map中
     * 再将存储当前登录用户的map存储到全局的servletContext域中以保证其生命周期
     * @param se
     */
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        Object attributeValue = se.getValue();
        HttpSession session = se.getSession();
        loginList.put(attributeValue.toString(),session);
        //
        se.getSession().getServletContext().setAttribute("loginList", loginList);
    }

    /**
     * 当有多个用户登录时，原本的session域中的用户信息受到替换从而触发下面方法
     * 增添一个新用户及其session到map中
     * 再存储到servletContext域中以覆盖旧的map
     * @param se
     */
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        Object attributeValue = se.getValue();
        HttpSession session = se.getSession();
        loginList.put(attributeValue.toString(),session);
        se.getSession().getServletContext().setAttribute("loginList", loginList);
    }

    /**
     * 当用户退出时 session被销毁后，由sessionDestroyed方法触发
     * 删除map中的用户信息及其session
     * 再将更新后的map存储到servletContext域中更新
     * @param se
     */
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        loginList.remove(se.getSession().getId());
        se.getSession().getServletContext().setAttribute("loginList",loginList);
    }
}
